﻿// See https://aka.ms/new-console-template for more information


ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();

//操作的是执行目录下的A.txt文本文件
string filePath = "A.txt";

File.WriteAllText(filePath, "罗纳尔多外星人\r\n");

//开启两个读文件线程
for(int i=1;i<=2;i++)
{
    Thread t = new Thread(ReadFileFunc);
    t.Start(i);
}

//开启两个写文件线程
for(int i=1;i<=2;i++)
{
    Thread t = new Thread(WriteFileFunc);
    t.Start(i);
}


//写文件
void WriteFileFunc(object? obj)
{
    while(true)
    {
        try
        {
            rwLock.EnterWriteLock();

            string currentTime = GetCurrentTime();
            string writeContent = $"{currentTime}--线程:{obj}写入新内容\r\n";
            File.WriteAllText(filePath,writeContent);
            Console.WriteLine(writeContent);
        }
        finally
        {
            rwLock.ExitWriteLock();
        }

        //睡眠必须放在try finally 外面，否则锁没有释放，其他线程无法拿到控制执行权
        Thread.Sleep(2000);
    }
}

//读文件
void ReadFileFunc(object? obj)
{
    while(true)
    {
        try
        {
            //加读锁
            rwLock.EnterReadLock();

            // 读取所有行并获取最后两行
            string[] allLines = File.ReadAllLines(filePath);
            string[] lastTwoLines = allLines.Length >= 2
                ? allLines.Skip(allLines.Length - 2).ToArray()
                : allLines;

            Console.WriteLine($"{GetCurrentTime()}----线程{obj},读取最后两行内容：");
            foreach (string line in lastTwoLines)
            {
                Console.WriteLine(line);
            }
        }
        finally
        {
            //释放读锁
            rwLock.ExitReadLock();
        }

        //睡眠必须放在try finally 外面，否则锁没有释放，其他线程无法拿到控制执行权
        Thread.Sleep(2000);
    }
}

//获取当前时间，输出指定格式
string GetCurrentTime()
{
    return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff");
}